#ifndef  __CACHE_H__
#define  __CACHE_H__

#ifdef __cplusplus
extern "C" {
#endif

static inline void local_flush_icache_all(void)
{
    asm volatile("fence.i" ::: "memory");
}

static inline void Flush_Cache_AllAddr()
{
    local_flush_icache_all();
}

/**
 * @brief invalidateDCache
 *        作废所有dcahe的数据，如果再取数据将会从DDR中获取。
 */
static inline void invalidateDCache()
{
    local_flush_icache_all();
}

/**
 * @brief CleanInvalidateDCache
 *        把DCACHE的数据写回到DDR并作废所有dcahe的数据，保证DDR与Cache数据同步。
 */

static inline void CleanInvalidateDCache()
{
    local_flush_icache_all();
}

/**
 * @brief InvalidateSDCache_Range
 *        作废从addr开始的dsize大小的二级Cache数据，如果再取数据将会从DDR中获取。
 */
static inline void InvalidateSDCache_Range(unsigned long *addr, long dsize)
{
    local_flush_icache_all();
}

/**
 * @brief CleanSDCache_Range
 *        从addr开始的dsize大小的二级Cache数据写回到DDR中，如果再取数据将会从DDR中获取。
 *        注意 X2600 小核没有二级 Cache
 */
static inline void CleanSDCache_Range(unsigned long *addr, long dsize)
{
    local_flush_icache_all();
}

/**
 * @brief InvalidateDCache_by_Addr
 *        从addr开始的dsize大小的Cache数据作做废掉，如果再取数据将会从DDR中获取。
 */
static inline void InvalidateDCache_by_Addr(unsigned long *addr, long dsize)
{
    local_flush_icache_all();
}

/**
 * @brief InvalidateDCache_by_Addr
 *        从addr开始的dsize大小的Cache数据作写回并做废掉，如果再取数据将会从DDR中获取。
 */
static inline void CleanInvalidateDCache_by_Addr(unsigned long *addr, long dsize)
{
    local_flush_icache_all();
}

/**
 * @brief InvalidateDCache_by_Addr
 *        从addr开始的dsize大小的Cache数据作写回，保证DDR与Cache数据同步。
 */
static inline void CleanDCache_by_Addr(unsigned long *addr, long dsize)
{
    local_flush_icache_all();
}
#endif

